import { App } from "../../App";
import { EventConst, Singleton } from "../../common/Common";
import CommConst from "../../const/CommConst";
import GameConst from "../../const/GameConst";
import wsTool, { WebSocketTool } from "../../net/ws";
import { loadCommonPreFab, showErrorTip } from "../../tools/PopuUp";
import UtilTool from "../../tools/UtilTool";
import { RoomJoinLayer } from "./RoomJoinLayer";

export class MultiMsgMgr {

    private static _instance : MultiMsgMgr = null;
    static getInstance() : MultiMsgMgr {
        if(this._instance == null) {
            this._instance = new MultiMsgMgr();
        }
        return this._instance;
    }

    constructor() {
        this.init()
    }

    init() {
        WebSocketTool.instance.addMessageListener(this.onMsgListener.bind(this))
    }

    // 监听服务器消息返回
    onMsgListener(data) {

        let msgCode = data.msgCode

        // UtilTool.printLog("test onMsgListener", msgCode, data)

        switch(msgCode) {
            case CommConst.Resq_ROOM_INFO_UPDATE: // 房间信息更新
                UtilTool.printLog("test 房间信息更新", data)
                App.Event.emit(EventConst.ROOM_INFO_UPDATE, data)
                break;

            case CommConst.Resq_ROOM_DESTROY: // 房间销毁
                UtilTool.printLog("test 房间销毁", data)
                App.Event.emit(EventConst.ROOM_DESTROY, data)
                break;

            case CommConst.Resq_ROOM_KICK_OUT: // 被踢出房间
                UtilTool.printLog("test 被踢出房间", data)
                App.Event.emit(EventConst.ROOM_KICK_OUT, data)
                break;
            
            case GameConst.Resp_RECONNECT_MULTIGAME: // 多人模式重连成功后下发的消息
                // TODO 房间加入的界面需要重新获取房间信息 

                // data.currentRoomStatus==0 等待中处理
                
                break;

        }

    }

    // 参赛
    sendJoin() : Promise<any> {
        let reqData = {
            msgCode : CommConst.Req_ROOM_READY,
        }
        return this.send(reqData)
    }

    // 发送匹配消息
    sendMatchMsg(roomType, gameType) : Promise<any> {
        let reqData = {
            msgCode : CommConst.Req_ROOM_QUICK_START,
            roomType : roomType,
            gameType : gameType,
        }
        return this.send(reqData)
    }

    // 发送成为持球人
    sendBeRoomMaster() {
        let reqData = {
            msgCode : CommConst.Req_ROOM_MASTER,
        }
        return this.send(reqData)
    }

    // 获取球室收益列表
    sendGetRoomIncome(page, pageSize) {
        let reqData = {
            msgCode : CommConst.Req_ROOM_INCOME,
            page : page,
            pageSize : pageSize,
        }
        return this.send(reqData)
    }

    // 退出房间
    sendRoomExit() : Promise<any> {
        let reqData = {
            msgCode : CommConst.Req_ROOM_EXIT,
        }
        return this.send(reqData)
    }

    // 发送开始游戏
    sendRoomStart() : Promise<any> {
        let reqData = {
            msgCode : CommConst.Req_ROOM_START,
        }
        return this.send(reqData)
    }

    // 房主踢人
    sendKickOut(member) : Promise<any> {
        let reqData = {
            msgCode : CommConst.Req_ROOM_KICK,
            account : member,
        }
        return this.send(reqData)
    }
    
    // 查找房间
    sendSearchRoomList(roomType, roomId) : Promise<any> {
        let reqData = {
            msgCode : CommConst.Req_ROOM_LIST,
            roomType : roomType,
            roomId : roomId,
            page : 0,
            pageSize : 10,
        }

        return this.send(reqData)
    }

    // 获取房间加入信息
    /**
     * 
     * @param roomType 房间类型 0普通球房 1专业球房
     * @param roomId 房间号
     * @param password 房间密码
     * @returns 
     */
    sendGetRoomJoinInfo(roomType, roomId, password) : Promise<any> {
        let reqData = {
            msgCode : CommConst.Req_ROOM_ENTER,
            roomType : roomType,
            roomId : roomId,
            password : password,
        }

        return this.send(reqData)
    }

    // 发送观战消息
    sendWatchGame(roomType, roomId, password) : Promise<any> {
        let reqData = {
            msgCode : 154,
            roomId : roomId,
            password : password,
            roomType : roomType
        }
        return this.send(reqData)
    }

    /**
     * 修改房间
     * @param canWatch 是否允许观战 true允许 false不允许
     * @returns 
     */
    sendModifyRoom(canWatch : boolean) : Promise<any> {
        let reqData = {
            msgCode : CommConst.Req_ROOM_MODIFY,
            canWatch : canWatch,
        }

        return this.send(reqData) 
    }

    // 获取房间列表
    /**
     * 
     * @param roomType 房间类型 0普通球房 1专业球房
     * @param page 页码
     * @param pageSize 每页大小
     * @returns 
     */
    sendGetRoomList(roomType, page, pageSize) : Promise<any> {
        let reqData = {
            msgCode : CommConst.Req_ROOM_LIST,
            roomType : roomType,
            page : page,
            pageSize : pageSize,
        }

        return this.send(reqData)
    }

    // 创建房间
    /**
     * 
     * @param roomType 房间类型 0普通球房 1专业球房
     * @param playAmount 入场金额
     * @param canWatch 是否允许观战 true允许 false不允许
     * @param password 房间密码
     * @param maxPlayer 最大人数
     * @param gameType 游戏类型 0多人对战 1四球开伦
     * @returns 
     */
    sendCreateRoom(roomType, gameType, password, canWatch, maxPlayer, playAmount) : Promise<any> {
        let reqData = {
            msgCode : CommConst.Req_ROOM_CREATE,
            roomType : roomType,
            playAmount : playAmount,
            canWatch : canWatch,
            password : password,
            maxPlayer : maxPlayer,
            gameType : gameType,
        }
        return this.send(reqData)
    }

    private send(data) : Promise<any> {
        UtilTool.printLog("test send data", data)

        // 发送消息不显示loading
        data.noLoad = true
        return wsTool.send(data)
    }
    
    
}

